package circularQueue;

// 模拟实现循环队列的功能
// 使用标记！
// 在数组中进行存储


class MyCircularQueue3 {
    public int[] array;
    public int front;
    public int rear;
    public boolean flag; // 进行rear==front 的标记！！:意思就是说：入队成功就是true 出队成功就是false
    // 则：入队成功+rear==front就是满了  出队+rear==front或者是默认的（也就是还没开始放）就是空的！！

    public MyCircularQueue3(int k) {
        array = new int[k];
    }
    
    public boolean enQueue(int value) {
        // 放元素
        if(isFull()) {
            return false;
        }
        this.array[rear] = value;
        this.rear = (this.rear+1) % array.length;
        // 成功入队：
        flag = true;
        return true;
    }
    
    public boolean deQueue() {
        if(isEmpty()) {
            return false;
        }
        this.front = (this.front+1) % array.length;
        flag = false;
        return true;
    }
    
    public int Front() {
        if(isEmpty()) {
            return -1;
        }
        return this.array[front];
    }
    
    public int Rear() {
        if(isEmpty()) {
            return -1;
        }
        return this.array[(this.rear+array.length-1)%array.length];
    }

    // 注意判空、判满的条件！！
    public boolean isEmpty() {
        // 空是：入队/没有操作(false)+相等！！
        if((this.front==this.rear) && (!flag)) {
            return true;
        }
        return false;
    }
    
    public boolean isFull() {
        // 满是：入队+相等！！
        if((this.front==this.rear)&&flag) {
            return true;
        }
        return false;
    }

    // 模拟一个打印操作：实际上没有这个方法
    public void print() {
        for (int i=this.front; i<this.rear; i++) { //注意循环条件！！！不是从0开始！！！
            System.out.print(this.array[i] + " ");
        }
        System.out.println();
    }
}
